#ifndef __UTILS_HH__
#define __UTILS_HH__

#include <iostream>
#include <list>
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <algorithm>

using namespace std;

#include "graph.hh"

void Swap(int & i, int & j); // hace el swap si i>j
void DecreaseMatrix(int ** M, int i, int j); // ver implementacion
void SetMatrix(int ** M, int i, int j, int k); // ver implementacion
int GetMatrix(int ** M, int i, int j); // ver implementacion
int Random(int i , int j); // retorna un numero aleatorio mayor igual a "i" menor a "j", con i<j
int Random(int i); // retorna un numero aleatorio mayor igual a 0 y menor a "j", con 0<j
Path * SelectRandom(list<Path *> * L); // retorna un camino aleatorio tomado de L, lo elimina de la lista
int SelectRandom(list<int> * L);
Path * Random(list<Path *> * L); // retorna un camino aleatorio tomado de L
pair<int,int>*  SelectRandom(list<pair<int,int>*> * L); // retorna un par aleatorio tomado de L, lo elimina de la lista
pair<int, int> * RandomEdge(Path * p); // selecciona un arista al azar del camino p, NO elimina la arista
int RandomNode(Path * p); // selecciona un nodo al azar, NO elimina el nodo
int Contains(list<int>* l, int elem);
void DeleteListPairInt(list<pair<int,int>*> *& list_pair);
void DeleteMatrix(int **& M, int size);
void DeleteListInt(list<int> *& l);
void DeleteListPath(list<Path*> *& l);
void DeletePair(pair<Graph*, PathMatrix*> *& elem);
list<Path*>* ClearCopy(list<Path*>* Lp);
void FileToGraph(const char * path, Graph * Gp);
void CleanListPath(list<Path*>* Lp);  // no borran el puntero (no se pasa el parametro por referencia)
void CleanListPairInt(list<pair<int,int>*> * list_mij); // no borran el puntero (no se pasa el parametro por referencia)
void CleanListInt(list<int> * l); // no borran el puntero (no se pasa el parametro por referencia)
void FileToGraph(const char * path, Graph * Gp); // carga desde archivo de Stainlib a Graph
bool ExistMiiGreaterThanZero(int ** M, int size); // devuelve true si existe mij>0 con i<=j
bool Uncoordinated(Graph * G, PathMatrix * P);
void PrintGraph(Graph * G); // print the graph
void PrintPath(Path *p); // print the path
void PrintPath(Path *p1, Path *p2);
void PrintListInt(list<int> * l);
void PrintListPath(list<Path *> * Lp);
void PrintListPairInt(list<pair<int,int>*> * l);
void PrintPartialGraph(Graph * G);
void PrintPathMatrix(PathMatrix * PM);

#endif
